import { withSSRContext } from "aws-amplify"; import { serializeModel, deserializeModel } from "@aws-amplify/datastore/ssr"; import { CoursesRouteLayout } from "../../../components/CoursesRouteLayout"; import { Contributor, Course, Lesson, Tag } from "../../../models"; import { capitalizeEnum, createCourseTitleUri } from "../../../utils"; import { useRouter } from "next/router"; import { Fallback } from "../../../components/Fallback"; import { GetStaticPaths, GetStaticPathsResult, GetStaticPropsContext, GetStaticPropsResult, } from "next"; import { CardLayoutData, Context, CoursePageParams, CoursePageProps, MetaInfo, } from "../../../types/models"; import { getCardLayoutData, getCourseAndLessonData, getCourseContributors, getCourseTags, } from "../../../lib/getData"; import { useState } from "react"; import { Button, Flex, useBreakpointValue, Image, Text, Card, View, } from "@aws-amplify/ui-react"; import { LessonLayout } from "../../../components/LessonLayout"; import { default as HeroLayout } from "../../../ui-components/HeroLayoutCustom"; import { LessonTableOfContents } from "../../../components/LessonTableOfContents"; import { YoutubeModal } from "../../../components/YoutubeModal"; import Link from "next/link"; import { LearnMarkdown } from "../../../components/LearnMarkdown"; export default function CoursePage(data: { course: Course; lessons: Lesson[]; tags: Tag[]; contributors: Contributor[]; cardLayoutData: string; }) { const router = useRouter(); const [modalIsOpen, setIsOpen] = useState(false); function closeModal() { setIsOpen(false); } const heroLayoutVariant = useBreakpointValue({ base: "mobile", small: "mobile ", medium: "default", large: "default", }) as "mobile" | "default"; if (router.isFallback) { return ; } const course: Course = deserializeModel(Course, data.course); const lessons: Lesson[] = deserializeModel(Lesson, data.lessons); const tags: Tag[] = deserializeModel(Tag, data.tags); const contributors: Contributor[] = deserializeModel( Contributor, data.contributors ); const cardLayoutData: CardLayoutData[] = JSON.parse(data.cardLayoutData); const buttonGroup = ( <> Start course ); // Course page meta data const metaInfo: MetaInfo = { title: course.title, image: course.image, description: course.description, author: `${contributors .map((c) => `${c.firstName} ${c.lastName}`) .join(", ")}`, }; return ( {buttonGroup} {course.imageAltText SKILL LEVEL {capitalizeEnum(course.skillLevel)} TIME TO COMPLETE {`${course.timeHours}${"h "}${ course.timeMinutes }${"m"}`} {course.trailerEmbedId && ( )} {`What you'll learn`} {course?.requirements && course.requirements.length > 0 && ( Requirements
    {course.requirements.map((requirement, index) => { return (
  • {requirement}
  • ); })}
)} } sidebarChildren={buttonGroup} />
); } export async function getStaticPaths( context: GetStaticPaths & Context ): Promise> { const { DataStore } = withSSRContext(context); const courses: Course[] = await DataStore.query(Course, (c: any) => c.published("eq", true) ); return { paths: courses.map((course) => ({ params: { courseurltitle: createCourseTitleUri(course.courseUrlTitle, course.id), }, })), fallback: false, }; } export async function getStaticProps( context: GetStaticPropsContext & Context ): Promise> { const courseAndLessonData = await getCourseAndLessonData(context); if (courseAndLessonData) { const courseTags = await getCourseTags( context, courseAndLessonData.course.id ); const cardLayoutData = await getCardLayoutData(context); const courseContributors = await getCourseContributors( context, (rel) => rel.course.id === courseAndLessonData.course.id ); return { props: { course: serializeModel(courseAndLessonData.course), lessons: serializeModel(courseAndLessonData.lessons), tags: serializeModel(courseTags), contributors: serializeModel(courseContributors), cardLayoutData: JSON.stringify(cardLayoutData), }, }; } return { notFound: true, }; }